<?php
class ContextLoader
{
	/******Singleton******/

	protected static $instance = null;

	public static function getInstance()
	{
		if ( self::$instance == null )
		{
			self::$instance = new self();
		}

		return( self::$instance );
	}
	/*********************/

	/**
	 * @var string Ruta de acceso base al directorio del sistema.
	 */
	public $contextPath = "";

	/**
	 * @var string Nombre del cargador que se utilizará.
	 */
	public $loaderName = null;

	/**
	 * @var string Ruta de acceso a la clase que contiene la configuración de inicio.
	 */
	public $contextConfig = "";

	/**
	 * Nombre del controlador global de excepciones.
	 */
	public $globalExceptionHandler = null;

	/**
	 * @var object Instancia del objeto de configuración especificado en la propiedad $contextConfig.
	 */
	public $configure = null;

	/**
	 * @var object Instancia del ClassLoader definido para este contexto.
	 */
	public $classLoader = null;

	/**
	 * @var object Objeto Application creado por este cargador de contexto.
	 */
	public $application = null;


	/**
	 * Inicializa el sistema, ejecuta el cargador y devuelve el objeto cargador configurado.
	 */
	public function init( $arguments = null )
	{
		if ( class_exists( $this->globalExceptionHandler ) )
		{
			$this->globalExceptionHandler = new $this->globalExceptionHandler();
		}

		$slash = substr( $this->contextPath, strlen( $this->contextPath ) - 1, 1);

		if ( ($slash == "/") || ($slash == "\\" ) )
		{
			$this->contextPath = substr( $this->contextPath, 0, strlen($this->contextPath) - 1 );
		}

		// Carga los gestores de clases.
		//
		require_once( $this->contextPath . "/loader/ClassFactory.php" );
		require_once( $this->contextPath . "/loader/ClassLoader.php" );
		require_once( $this->contextPath . "/core/AbstractApplication.php");

		$this->classLoader = ClassLoader::getInstance();

		// Carga el gestor de aplicación.
		//
		require_once( $this->contextPath . "/loader/" . $this->loaderName . ".php");

		if( $this->application == null )
		{
			$this->application = new $this->loaderName( $this );
		}

		return( $this->application );
	}
}
?>
